#ifndef UMSDATABASE_H
#define UMSDATABASE_H


#include <QObject>
#include <QDomElement>
#include <QDomDocument>

#include "http.h"
#include "umsdata.h"

typedef bool (*Open)(char*,int,char*,char*);
typedef char* (*DatabaseStruct)(char*);

/**
Класс работы с базой данных UMS FAD
*/
class UMSDatabase: public QObject
{
        QLibrary *_lib;
	Http *_http;
	QString _server;
	QString _user;
	QString _lastDatabase;
	bool _isOpened;
	int _port;
	QByteArray _rawdata;
	QString _lastError;
	QString soapXml(const QString &query);
	QString soapXmlCommand(const QString &command,const QString &dbname=QString(),const QString &content=QString());
	QString soapXmlCommandSetStruct(const QDomDocument &doc);
	QDomElement _currentVector;
	UMSData _data;
	QDomDocument _doc;
	void procData(QString data);
	QByteArray sendQuery(const QByteArray &data);
	void checkSelectDatabase(const QString &query);
	void setCurrentVector(QDomElement vec);
public:
	UMSDatabase(const QString &server="127.0.0.1",int port=1588); ///< конструктор класса.
	bool open(const QString &user,const QString &passwd); ///< открывает соединение с базой данных.
	QString lastError(); ///< возвращает текст последней ошибки работы с БД
	bool exec(const QString &query); ///< выполняет запрос.
	bool execXML(const QString &query); ///< выполняет XML запрос.
	void first(); ///< переходит к первому полученному вектору.
	bool next(); ///< переходит к следующему полученному вектору.
	bool prev(); ///< переходит к предыдущему полученному вектору.
	QString server(); ///< возвращает имя сервера, к которому произведено подключение.
	QString user(); ///< возвращает имя пользователя.
	QString lastDatabase(); ///< возвращает наименование БД, к которой было последнее подключение.
	QDomElement vector(); ///< возвращает текущий вектор данных.
	QByteArray rawData(); ///< возвращает необработанные данные полученные от сервера.
	void setHost(const QString &addr);	///< устанавливает имя сервера для подключения.
	QDomDocument databaseStruct(const QString &name); ///< возвращает структуру базы данных по ее имени.
	void sendDatabaseStruct(const QDomDocument &doc); ///< отправляет структуру БД на сервер.
	int answerCode(); ///< возвращает код ответа сервера.
	QString uin(); ///< возвращает УИН текущего вектора.
	QString value(const QString &name); ///< возвращает значение координаты name из текущего вектора.
	QStringList values(const QString &name); ///< возвращает список значений координаты name из текущего вектора.
};	

#endif
